package fschmidt.util.java;

import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;
import java.util.LinkedHashSet;


public final class CollectionUtils {
	private CollectionUtils() {}  // never

	public static <K,V> Map<K,V> optimizeMap(Map<K,V> map) {
		switch( map.size() ) {
		case 0:
			return Collections.emptyMap();
		case 1:
			Map.Entry<K,V> entry = map.entrySet().iterator().next();
			return Collections.singletonMap(entry.getKey(),entry.getValue());
		default:
			return new HashMap<K,V>(map);
		}
	}

	public static <T> List<T> optimizeList(List<T> list) {
		switch( list.size() ) {
		case 0:
			return Collections.emptyList();
		case 1:
			return Collections.singletonList(list.get(0));
		default:
			return new ArrayList<T>(list);
		}
	}

	public static <T> Set<T> optimizeSet(Set<T> set) {
		switch( set.size() ) {
		case 0:
			return Collections.emptySet();
		case 1:
			return Collections.singleton(set.iterator().next());
		default:
			return new HashSet<T>(set);
		}
	}

	public static <T> Set<T> optimizeLinkedSet(Set<T> set) {
		switch( set.size() ) {
		case 0:
			return Collections.emptySet();
		case 1:
			return Collections.singleton(set.iterator().next());
		default:
			return new LinkedHashSet<T>(set);
		}
	}

	public static boolean intersects(Set set,Iterable col) {
		for( Object obj : col ) {
			if( set.contains(obj) )
				return true;
		}
		return false;
	}

	public static boolean intersects(Set set,Object[] col) {
		for( Object obj : col ) {
			if( set.contains(obj) )
				return true;
		}
		return false;
	}

}
